package cn.hinglo.common.util;

import cn.hinglo.common.annotation.RequestMapping;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ReflectUtil;
import com.jfinal.aop.Interceptor;
import com.jfinal.config.Routes;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;

import java.util.Set;

/**
 * @createTime: 2019/1/6
 * @author: HingLo
 * @description: 路由自动扫描工具
 */
public class RoutesKit {
    /***
     * 初始化路由工具 在JFinalConfig中configRoute方法中调用,通过对controller上加上RequestMapping 来自动扫描与初始化路由<br>
     * 需要通过:hutool工具包中ClassUtil工具来进行扫描类
     * @param routes JFinalConfig 中路由配置的configRoute 参数
     */
    public static void initRoutes(Routes routes) {
        //扫描项目下的所有的带有RequestMapping 的Controller
        Set<Class<?>> set = ClassUtil.scanPackageBySuper("", Controller.class);
        for (Class x : set) {
            RequestMapping annotation = (RequestMapping) x.getAnnotation(RequestMapping.class);
            // 用来限制只有加上了RequestMapping注解的controller才进行自动初始化
            if (annotation == null) {
                continue;
            }
            // 获取controllerKey
            final String path = getPath(annotation.value());
            // 获取视图路径
            String viewPath = annotation.viewPath();
            // 获取拦截器
            Class<? extends Interceptor>[] interceptor = annotation.interceptor();

            Routes routes1 = new Routes() {
                @Override
                public void config() {
                    // 添加拦截器
                    if (interceptor.length > 0) {
                        for (Class<? extends Interceptor> aClass : interceptor) {
                            addInterceptor(ReflectUtil.newInstance(aClass));
                        }
                    }
                    // 设置视图,如果视图是空,使用path 作为视图路径
                    setBaseViewPath(StrKit.isBlank(viewPath) ? path : viewPath);
                    // 设置路由
                    add(path, x);
                }
            };
            routes.add(routes1);
        }
    }

    /***
     * 请求路由处理
     * @param path 原始路由
     * @return 返回处理后的路由
     */
    private static String getPath(String path) {
        path = path.trim();
        if (!path.startsWith("/")) {
            path = "/" + path;
        }
        if (path.endsWith("/") && path.length() > 1) {
            path = path.substring(0, path.length() - 1);
        }
        return path;
    }
}
